package org.donald.g1;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

import org.donald.g1.task.TaskExecutors;
import org.donald.g1.task.TaskThread;
import org.donald.g1.task.TaskThreadFactory;
import org.donald.g1.task.TestRunnable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * JVM内存永久区已经被metaspace替换（JEP 122）。JVM参数 -XX:PermSize 和
 * –XX:MaxPermSize被XX:MetaspaceSize 和 -XX:MaxMetaspaceSize代替。
 * 
 * Java 8新特性终极指南:http://www.importnew.com/11908.html,http://blog.jobbole.com/109170/
 * 深入理解 Java G1 垃圾收集器:http://blog.jobbole.com/109170/
 * 
 * OpenJDK 8 有多种 GC（Garbage Collector）算法，如 Parallel GC、CMS 和 G1。如果在
 * Java 9 中将 Java 8 默认的 GC 从 Parallel GC 改为 G1 （目前只是建议）将会怎么样呢？
 * 让我们对此进行基准测试。基准测试方法:
 * 运行相同的代码六次，每次使用不同的VM参数（-XX:+UseSerialGC, -XX:+UseParallelGC,
 * -XX:+UseConcMarkSweepGC, -XX:ParallelCMSThreads=2, -XX:ParallelCMSThreads=4,
 * -XX:+UseG1GC）。
 * ---------------------------------------
 * 调试参数 Run Configuration：
 * -Xms128m -Xmx256m  -XX:+UseG1GC -XX:MetaspaceSize=16m -XX:MaxMetaspaceSize=32m -XX:MaxGCPauseMillis=200
 * 
 * @author donald 2018年3月7日 下午5:35:50
 */
public class G1Application {
	private static final Logger log = LoggerFactory.getLogger(G1Application.class);

	public static void main(String[] args) {
		ExecutorService exec = TaskExecutors.newTaskExecutors(16, 32, 5000, TimeUnit.MILLISECONDS,
				new LinkedBlockingQueue<Runnable>());
		TaskThreadFactory taskThreadFactory = new TaskThreadFactory("test");
		log.info("start...");
		for (int i = 0; i < 32; i++) {
			TestRunnable testRunnable = new TestRunnable();
			TaskThread taskThread = taskThreadFactory.newThread(testRunnable);
			exec.submit(taskThread);
		}
	}
}
